#include <bits/stdc++.h>
using namespace std;
#define int long long
set<int>se,nse;
const signed N=1e5+5;
struct qj{
	int l,r;
}p[N];
bool cmp(qj a,qj b){
	if(a.r==b.r) return a.l<b.l;
	else return a.r<b.r; 
}
int d[N],v[N],a[N];
signed main(){
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	int T;cin>>T;
	while(T--){
		int n,m,len,lim,num=0,ans=0;
		cin>>n>>m>>len>>lim;
		for(int i=1;i<=n;i++)
			cin>>d[i]>>v[i]>>a[i];
		for(int i=1;i<=m;i++){
			int k;cin>>k;
			se.insert(k);
		}
		for(int i=1;i<=n;i++){
			int nd=d[i],nv=v[i],na=a[i];
			int l=0,r=-1;
			if(na==0){
				if(nv>lim){
					l=nd;r=len;
				}
			}
			else if(na>0){
				if(nv>lim){
					l=nd;r=len;
				}
				else{
					l=(2*nd*na+lim*lim-nv*nv)/(2*na)+1;
					r=len;
				}
			}
			else if(na<0){
				if(nv>lim){
					l=nd;r=(2*nd*na+lim*lim-nv*nv)/(2*na);
				}
			}
			if((*(se.upper_bound(l-1)) )<=r   ){
				if(se.upper_bound(l-1)!=se.end()){
					num++;
					p[num].l=l;p[num].r=r;
				}
			}
			d[i]=0;v[i]=0;a[i]=0;
		}
		cout<<num<<' ';
		sort(p+1,p+1+num,cmp);
		for(int i=1;i<=num;i++){
			int l=p[i].l,r=p[i].r;
			if((*nse.upper_bound(l-1) )>r || nse.upper_bound(l-1)==nse.end() ){
				ans++;
				nse.insert(*se.lower_bound(r) );
			}
			p[i].l=0;p[i].r=0;
		}
		cout<<m-nse.size()<<endl;
		se.clear();
		nse.clear();
	}
	return 0;
}
